/-----------------------------------------------------------------------\
|-[ 10 ]----[ IPv6, la nueva generacion de IP. ]----[ Medio/Alto]-------|
\--------------------------------------------------------------[ Ripe ]-/

Cuando se diseo el protocolo IP no se tuvo en cuenta se conectarian entre
si LAN's, WAN's.... creando una internet immensa conocida como Internet
(notese la "I" mayuscula ), lo que hace que la version actual de IP (la
version 4) no sea la mas adecuada para este entorno, ya que limita el
numero maximo de hosts conectados a %%% ademas de dificultar los usos de
IP fija y de conexion permanente, por ello la IETF (Internet Engineering
Task Force) estudio la posiblidad de mejorar el direccionamiento apliando
el tamao de las direcciones IP de 32 bits a 128 bits, lo que premite un
mayor numero de hosts conectados (%%%). Nacio el proyecto IPv6 (tambien
llamda IP de siguiente generacion). Una descripcion rapida de la nueva
generacion de IP (que aun esta en desaroyo) podria ser la siguiente.

-Mayor numero de direcciones, pues amplia de 32 bits a 128 bits el tamao
 de las direcciones.

-Permiete dividir la direccion IP en 16 octeros (en IPv4 se dividian en
 4) y facilitar el enrutamiento con una estructura gerarquica comparable a
 la numeracion de los numero de telefono.

-Simplicidad de la cabecera basica, ampliable gracias a unas cabeceras de
 extension (gran idea si seor).

-Permite adaptarse a los requerimientos de una tranmision (datos de
 fichero, videoconferencia....).

-Mejora la seguridad a nivel de IP (autentificacion, confidencialidad,
 integridad de datos....). 

-Permite el tranporte de protocolos poco usuales.

-Adquiere muchas mejoras a la hora de localizar routers fuera de
 servicio, inalcanzables....

NOTA: Buaaaa! Cuanta mejora.... Como se las habran apaado?

Lo primero que vamos a ver es el direccionamiento. Las direcciones en IPv6 
constan de 16 octeros, y se representa con ocho numeros hexadecimales
separados por dos puntos ":". Son direcciones validas las siguientes:

	         41B3:0301:A349:0:0:D567:F5F6:AD49

                 9AFD:0:0:0FDA:98D4:F45E:EE56:65F3

Como se puede ver es una forma algo fea, pero es lo que hay.

Es posible simplificar un poco la representacion de las direcciones IP en
IPv6, si se encuentran varios 0's consecutivos, estos pueden ser
substituidos por "::", por lo que las dos IP's anteriores nos quedaerian:

		41B3:0301:A349::D567:F5F6:AD49

                9AFD::0FDA:98D4:F45E:EE56:65F3

Pero esto solo es posible hacerlo una vez por IP, es decir que si tenemos
4C56:0:0:0:3D98:0:0:67D1, podemos simplificarla como 4C56::3D98:0:0:67D1
o como 4C56:0:0:0:3D98::67D1, pero nunca como 4C56::3D98::67D1, pues seria
imposible deducir la cantidad de zeros que se hallan en cada "::".

Es posible mediante una IP de la version 6 hacer referencia a una IP de la
version 4, para ello usaremos ::FFFF:<ip en version4>, por ejemplo la IP
194.63.2.12, se representaria en IPv6 como ::FFFF:194.63.2.12. 

A diferencia de la version actual de IP, IPv6 tratara de realizar una
estructura gerarquica de la numeracion, para ello la IANA se ha puesto
manos la obra para delegar trozos del espacio de las direcciones IP para
realizaf funciones y/o identificar organicaciones regionales. De momentoi
se posee la siguiente tabla que asigna funciones mediante los primeros
bits de la direccion IP (los llamado prefijos de formato, pues depende de 
ello como esta estructurado el resto de la direccion IP).

	0000 0000	Reservado
	0000 0001	No asignado
	0000 001	Para asignacion de NSAP
	0000 010	Para asignacion de IPX
	0000 011	No asignado
	0000 1		No asignado
	0001		No asignado
	001		No asignado
	010		Direcciones unienvio para proveedores ;)
        011		No asignado
	100		Direcciones unienvio geograficas
	101		No asignado
	110		No asignado
	1110		No asignado
	1111 0		No asignado
	1111 10		No asignado
	1111 110	No asignado
	1111 1110 0	No asignado
	1111 1110 10	Direcciones de uso por enlace local
	1111 1110 11	Direcciones de uso local
	1111 1111	Multienvio 

Vamos ahora a ver como se completarian las direcciones IP de algunos de
los tipos que hemos visto en esta tabla....

Empezaremos con las direcciones unienvio para proveedores (prefijo
010). Para este tipo se usa una estructura muy simple pero al mismo tiempo
muy efectiva, es la siguiente

    010  -  ID registro  -  ID proveedor  -  ID cliente  -  En el cliente

No hay tamao fijo para cada uno de estos campos, pero su efectividad
recae en la facilidad de enrutar el trafico, pues basta con comparar la
ID con las entradas en la tabla de enrrutado y.... errutar (eruptar?) ;)

Vamos a ver ahora las direcciones de enlace local (prefijo 1111 1110 10),
que tambien son muy simples.

       1111 1110 10  -  Relleno(00..)  -  Direccion unica del enlace

Donde la direccion unica del enlace podria ser la MAC adress de la maquina
de un LAN.

Que simple no? xD

Y como seran entonces las direcciones para uso local? (prefijo 1111 1110
11) A ver.... :P

 1111 1110 11  -  Relleno(00..)  -  ID subred  -  Direccion unica del enlace

Vaya... sigue sin complicarse demasiado.... :)

Para terminar veamos como funcionan los formatos de las direcciones de
multienvio (prefijo 1111 1111).

            1111 1111  -  000x  -  Ambito  -  ID grupo

Ostia! se nos ha complicado.... que es todo esto?

Como se puede ver el multienvio en IPv6 esta mucho mas elavorado que el de
IPv4, pues mediante el bit "x" podemos indicar si la direccion de
multienvio es permanente (si vale 0) o es temporal (si vale 1), ademas
mediante el ambito, que ocupa 4 bits, podemos indicar lo siguiente:

	0		Reservado
	1		Ambito local al nodo
	2		Ambito local al enlace
	3		No asignado
 	4		No asignado
	5		Ambito local al lugar
	6		No asignado
	8		Ambito local a la organizacion
	9		No asignado
	A		No asignado
	B		No asignado
	C		No asignado
	D		No asignado
	E 		Ambito global
	F		Reservado 

Ya sabemos como funcionan un poco las direcciones IPv6, pero y las
direcciones especiales? como es la tipia 127.0.0.1 en IPv6? Pues al igual
que en la version 4, en la 6 tambien hay direcciones especiales, las
nombro simplemente (no creo que necesiten explicacion).

	0:0:0:0:0:0:0:0		Direccion sin especificar (cuando un
                                sistema aun no conoce su direccion IP)

        0:0:0:0:0:0:0:1		Clasico loopback (loop.... ke? xD)

	0:0:0:0:FFFF:a.b.c.d	IPv4

Visto ya el direccinamiento pasemos al analisi de la cabecera de IPv6,
veremos que tiene multiples mejoras a la cabezera de la version 4 de IP,
veamos.

***************************[ Cabecera de IPv6 ]***************************

       -------------------------------------------------------------
       |  Ver.  | Prior. |           Etiqueta de flujo             |
       -------------------------------------------------------------
       |     Tamao carga util      | Sig Cabecera |      TTL      |
       -------------------------------------------------------------
       |                 Direccion IP de origen                    |
       |                                                           |
       -------------------------------------------------------------
       |                 Direccion IP de destino                   |
       |                                                           |
       -------------------------------------------------------------

**************************************************************************

Como podeis ver vuelve a destacar la simplicidad, una cabecera mil veces
mas simple que la de IPv4, pero no menos potente y/o util, pues permite
extensiones, veremos como, pero antes comentare un poco cada unos de los
campos de la cabecera :)

1.-VERSION (4 bits): Creo que no necesita explicacion... :->

2.-PRIORIDAD (4 bits): Si un router se ve obligado a descartar un paquete
                       descartara el que tenga menos prioridad.

3.-ETIQUETA DE FLUJO (24 bits): Indica si el paquete necesita algun
                                tratamiento especial.

4.-TAMAO CARGA UTIL (16 bits): Indica el tamao de la parte del paquete
                                que sigue a la cabecera inicial de IP.

5.-CABECERA SIGUIENTE (8 bits): Indica la cabecera que sigue a la actual,
                                sea una extension de IP o la de otro
                                protocolo.

6.-TTL: Cada vez que el paquete pasa por un router el valor del TTL se
        decrementa, si este llega a 0 el paquete es descartado.

7.-DIRECCION IP DE ORIGEN (128 bits): Hu....?

8.-DIRECCION IP DE DESTINO (128 bits): Mmm.....?

Bueno con todo esto mas o menos claro vamos a ver como funcionan las
extensiones de cabeceras en esta version de IP.... El campo "cabecera
siguiente" es muy comparable al campo "protocolo" de IPv4, pues si este
tiene el valor 6 la cabecera siguiente sera la de TCP, y si tiene el valor
17 la de UDP, pero ahora ademas puede servir para extender IP y aadir
funciones como fragmentacion (seguro que os estavais preguntando y la
fragmentacion? :P), encaminamiento, autentificacion, bla bla bla xD Veamos
los valores que puede tomar para extension de cabeceras, mas adelante
veremos el formato de las extensiones :)

	0		Opciones de salto a salto
	43		Encaminamiento
	44		Fragmentacion
	50		Encapsulado seguro de la carga util
	51		Autentificacion
	59		Sin mas cabeceras

Bueno veamos ahora cada una de estas extensiones.... por cual
empezamos? hummmm, Opciones de salto a salto, venga.

Las cabeceras de opcion de salto a salto llevan informacion de ciertas
opciones que deben ser analizadas en cada uno de los hosts de la ruta,
veamos como es esta extenxion

**************[ Extension "Opciones de salro a salto" ]******************* 

       -------------------------------------------------------------
       | Sig Cabecera | Tam. extension|                            |
       --------------------------------                            |
       |                        Opciociones                        |
       -------------------------------------------------------------

***************************************************************************

1.-SIGUIENTE CABECERA (8 bits): Pues eso, la cabecera siguiente.

2.-TAMAO EXTENSION (8 bits): Supongo que indica el tamao del campo
                              opciones, pero no lo puedo asegurar :P

3.-OPCIONES (? bits): este campo es de tamao variable, y contiene una
                      entrada del tipo... 

                               [tipo][tamao][valor opcion]

                      ...por cada opcion, tanto el campo "tipo" como el
                      campo "tamao" ocupan 8 bits, al campo valor de
                      "valor de opcion" varia su tamao dependiendo del
                      valor del campo "tamao"

La extension de la cabecera de encaminamiento posee un campo tipo que
permitira realizar diferentes tareas el futuro (digo en el futuro porque
de momento solo se ha definido el valor 0, el cual tiene una semejanza con
la ruta de origen de IPv4).

********************[ Extension "Encaminamiento" ]************************

       -------------------------------------------------------------
       | Sig Cabecera | Tam direccion|     Tipo      | Seg perdidos|       
       -------------------------------------------------------------
       |  Reservado   |    Mascara de bits estricta/desconectada   |
       -------------------------------------------------------------
       |                        Direccion 1                        |
       |                                                           |
       -------------------------------------------------------------
       |                        Direccion 2                        |
       |                                                           |
       -------------------------------------------------------------
       |                        Direccion 3                        |
       |                                                           |
       -------------------------------------------------------------
       |                          .......                          |
       |                                                           |
       -------------------------------------------------------------
       |                        Direccion n                        |
       |                                                           |
       -------------------------------------------------------------

***************************************************************************

1.-SIGUIENTE CABECERA (8 bits): Lo mismo de siempre.

2.-TAMAO DIRECCION (8 bits): Indica el tamao de toda la parte de
                              direccion.

3.-TIPO (8 bits): De momento siempre vale 0.... ya veremos que se hace en
                  un futuro.

4.-MASCARA DE BITS (24 bits): Indicara si el salto corresponde a un vecino
                              (en cuyo caso seria estricta) o no es
                              necesario que lo sea (en cuyo caso seria
                              desconectada).

5.-DIRECCIONES (128*dirs bits): Indica cada uno de los saltos definidos,
                                el ultimo salto debe coincidir con el host
                                de destino.

Una de las cosas mas importantes que tenia la version 4 de IP era sin duda
la fragmentacion. Pues esta en IPv6 ha sufrido alguna que otra variacion,
de entrada un paquete solo podra ser fragmentado por el nodo de
origen. Vaya! Y que pasa si un router recibe un paquete demasiado
grande? Pues que lo descarta directamente y genera un ICMP hacia el host
de origen del paquete fragmentado indicando el tamao que deberia tener el
paquete para que este pueda mandarlo por donde debe. 

Asi pues, por defecto un paquete no se fragmenta. Veamos como es la
extencion de cabecera que se encarga de la fragmentacion.

*********************[ Extension "Fragmentacion" ]************************

       -------------------------------------------------------------
       | Sig cabecera |  Reservado  | Despl. de fragmento | Res | +|   
       -------------------------------------------------------------
       |               Identificador de fragmento                  |
       -------------------------------------------------------------

**************************************************************************

1.-SIGUIENTE CABECERA (8 bits): Dios! que pesados se estan poniendo :P

2.-DESPLAZAMIENTO DE FRAGMENTO (13 bits): Indica el desplazamiento del
                                          fragmento dentro del paquete
                                          original. 
3.-BIT MAS [+] (1 bit): Indica si es el ultimo fragmento, o si hay mas
                        fragmentos detras.

4.-IDENTIFICADOR DE FRAGMENTO (32 bits): Todos los fragmentos de un mismo
                                         paquete original tendran el mismo
                                         valor, sirve para que el host de
                                         destino sepa cuales son los
                                         fragmentos que debe reagrupar.

Bueno vistas todas las extensiones, vamos a ver un paquete de
ejemplo... queda algo cutre ya lo se.

*********************[ Un paquete TCP/IP con IPv6 ]***********************

       -------------------------------------------------------------
       |   6    |   6    |                   0                     |
       -------------------------------------------------------------
       |     Tamao carga util(*)   |      44      |      10       |
       -------------------------------------------------------------
       |           A435:B308:9823:AAF4:B452:0D45:0:5DA4            |
       |                                                           |
       -------------------------------------------------------------
       |           0A23:65B2:D4E1:0:FE04:6963:A54A:FF28            |
       |                                                           |
       -------------------------------------------------------------
       |      6       |  Reservado  |         1024        | Res | 0|
       -------------------------------------------------------------
       |                           3289                            |
       -------------------------------------------------------------
       |             1099           |              23              |
       -------------------------------------------------------------
       |                          1678                             |
       -------------------------------------------------------------
       |                          3421                             |
       -------------------------------------------------------------
       |Tam cab.(*)| Reserv| 011000 |              4000            |
       ------------------------------------------------------------- 
       |    Suma de control(*)      |                0             |
       -------------------------------------------------------------
       |                                                           |
       |                          DATOS                            |
       |                                                           |
       -------------------------------------------------------------

(*) El relleno de este campo te lo dejo a ti anda :)

*****************************************************************************

Como puedes ver, se trata del ultimo fragmento de un paquete fragmentado
que corresponde a una conexion telnet, y que ocupa la posicion 1024 en el
paquete original. Gracias a las flags de la cabecera TCP podemos deducir
que la conexion ya se ha establecido.... :)

Si dispones de una red trabajando con IPv6 (no es mi caso) y quieres
dedicarte a la experimentacion y programacion de aplicaciones con IPv6, es
bueno saber que dispones de <netinet/ip6.h>, en el que estan definidas las
structuras correspondientes a las cabeceras que hemos visto.

Thz por la lectura.

*EOF*
